package d2_buffered_stream;

import java.io.*;

/**
 * 2024/6/19  观察原始流和缓冲流的性能 Cjj 13:49
 */
public class TimeTest4 {
    //复制的视频路径
    private static final String SRC_FILE="D:\\Fialshell-命令图片\\WIN_20240619_17_47_38_Pro.mp4";
    //复制到哪个目的地
    private static final String DEST_FILE="D:\\Fialshell-命令图片";

    public static void main(String[] args) {
        /**性能越大越好 但是大到一定程度的时候, 就不明显了*/
        //copy01();//低级字节流一个一个字节的赋值,太慢了 淘汰！！
        copy02();//低级的字节流按照一个一个字节数据的形式复制,速度较慢！
        //copy03();//缓冲流按照一个一个字节的形式复制,速度较慢 淘汰！！
        copy04();//缓冲流按照一个一个字节数据的形式复制,速度极快,推荐使用！ 之所以快 使用了是一个8KB的缓冲池

    }

    //使用低级的字节流按照一个一个字节的形式复制文件
    private static void copy01(){
       final long startTime = System.currentTimeMillis();
        try (
             InputStream is= new FileInputStream(SRC_FILE);
            OutputStream os = new FileOutputStream(DEST_FILE + "1.avi");
        ){

            int b;
            while ((b=is.read())!=-1){
                os.write(b);
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("低级字节流一个一个字节复制耗时："+(endTime-startTime)/1000.0+"s");
    }

    //使用低级的字节流按照字节数组的形式复制文件
    private static void copy02() {
        long startTime = System.currentTimeMillis();
        try (
                InputStream is = new FileInputStream(SRC_FILE);
                OutputStream os = new FileOutputStream(DEST_FILE + "2.avi");
        ) {

            byte[] buffer = new byte[1024*64];
            int len;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
        long endTime = System.currentTimeMillis();
        System.out.println("低级字节流使用字节数组复制耗时："+(endTime-startTime)/1000.0+"s");
    }

    //使用高级的缓冲字节流按照一个一个字节的形式复制文件
    private static void copy03(){
        final long startTime = System.currentTimeMillis();
        try (
                InputStream is= new FileInputStream(SRC_FILE);
                BufferedInputStream bis = new BufferedInputStream(is);
                OutputStream os = new FileOutputStream(DEST_FILE + "3.avi");
                BufferedOutputStream bos= new BufferedOutputStream(os);
        ){

            int b;
            while ((b=bis.read())!=-1){
                bos.write(b);
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("缓冲字节流按照一个一个字节复制耗时："+(endTime-startTime)/1000.0+"s");
    }

    //使用高级的缓冲字节流按照字节数组的形式复制文件
    private static void copy04() {
        long startTime = System.currentTimeMillis();
        try (
                InputStream is= new FileInputStream(SRC_FILE);
                BufferedInputStream bis = new BufferedInputStream(is,32*1024);
                OutputStream os = new FileOutputStream(DEST_FILE + "4.avi");
                BufferedOutputStream bos= new BufferedOutputStream(os,32*1024);
        ) {

            byte[] buffer = new byte[1024*64];//8kb
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
        long endTime = System.currentTimeMillis();
        System.out.println("缓冲字节流使用字节数组复制耗时："+(endTime-startTime)/1000.0+"s");
    }
}
